// * 创建函数的语法：let func = new Function([arg1, arg2, ...argN], functionBody)

// 例子：
let sum = new Function('a', 'b', 'return a + b')
console.log(sum(1, 2)) // 3

// 没有参数只有函数体的例子：
let sayHi = new Function('console.log("Hi")')
sayHi() // Hi

// *********************************************************************************************************************

// * new Function 允许我们将任意字符串变为函数。例如，从服务器接收一个新的函数并执行它。
// * 通常，闭包是指使用一个特殊的属性 [[Environment]] 来记录函数自身的创建时的环境的函数。它具体指向了函数创建时的词法环境（代码位置，变量，等等）。
// * 但是如果我们使用 new Function 创建一个函数，那么该函数的 [[Environment]] 并不指向当前的词法环境，而是指向全局词法环境。而不是函数所在的外部词法环境。
// * 当我们需要向 new Function 创建出的新函数传递数据时，我们必须显式地通过参数进行传递（不要直接在函数体中使用外部定义的变量）。

// good写法:
function getF0(params) {
	let funcStr = 'return a + b'
	let func = new Function('a', 'b', funcStr)
	console.log(func(1, 3)) // 4 （显示的传递参数）
}

getF0()

// bad写法:
// let a = 1 ,b = 2; // 加了这行代码虽然不会报错了，但这是非常不好的写法。
function getF1() {
	let a = 1
	let b = 2
	let funcStr1 = 'return a + b'
	let func1 = new Function(funcStr1) // 指向全局词法环境
	console.log(func1()) // 报错
}

getF1()
